/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

import io.VentaDTO;
import io.VentaReducidaDTO;
import java.sql.*;
import java.util.ArrayList;

/**
 * Esta clase representa al gestor de la tabla venta que se encuentra
 * almacenada en la base de datos.
 * @author nahuel
 */
public class MySQLVentaDAO {

    /**
     * Este método devuelve una lista con todas las ventas almacenadas en la 
     * base de datos
     * @return lista de ventas
     * @throws DAOException 
     */
    public ArrayList<VentaDTO> listarVentas() throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            ResultSet rs = stat.executeQuery("select * from venta order by fecha");
            ArrayList<VentaDTO> lista = new ArrayList();
            while (rs.next()) {
                VentaDTO venta = new VentaDTO(rs.getInt("id"), rs.getDate("fecha"), rs.getInt("idCliente"), rs.getInt("idGarante1"), rs.getInt("idGarante2"), rs.getString("tipo"), rs.getDouble("precio"), rs.getDouble("entrega"), rs.getString("descripcion"));
                lista.add(venta);
            }
            rs.close();
            return lista;
        } catch (SQLException e) {
            throw new DAOException("Error al leer las ventas desde la base de datos", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }

    /**
     * Este mensaje permite insertar una nueva venta en la base de datos
     * @param venta
     * @throws DAOException 
     */
    public void agregarVenta(VentaDTO venta) throws DAOException {
        Object idgarante1 = null;
        if (venta.getGarante1() != null) {
            idgarante1 = venta.getGarante1().getId();
        }
        Object idgarante2 = null;
        if (venta.getGarante2() != null) {
            idgarante2 = venta.getGarante2().getId();
        }
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            stat.executeUpdate("insert into venta (fecha,idCliente,idGarante1,idGarante2,tipo,precio,entrega,descripcion) values ('" + venta.getFecha() + "'," + venta.getCliente().getId() + "," + idgarante1 + "," + idgarante2 + ",'" + venta.getTipo() + "'," + venta.getPrecio() + "," + venta.getEntrega() + ",'" + venta.getDescripcion() + "')", Statement.RETURN_GENERATED_KEYS);
            ResultSet generatedKeys = stat.getGeneratedKeys();
            if (generatedKeys.next()) {
                venta.setId(generatedKeys.getInt(1));
            }
        } catch (SQLException e) {
            throw new DAOException("Error al insertar la venta en la base de datos", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }

    /**
     * Este mensaje permite modificar los datos de una venta
     * @param venta
     * @throws DAOException 
     */
    public void actualizarVenta(VentaDTO venta) throws DAOException {
        Object idgarante1 = null;
        if (venta.getGarante1() != null) {
            idgarante1 = venta.getGarante1().getId();
        }
        Object idgarante2 = null;
        if (venta.getGarante1() != null) {
            idgarante2 = venta.getGarante1().getId();
        }
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            stat.executeUpdate("update venta set idCliente = " + venta.getCliente().getId() + ",idGarante1 = " + idgarante1 + ",idGarante2 = " + idgarante2 + ",precio = " + venta.getPrecio() + ",entrega = " + venta.getEntrega() + ",descripcion = '" + venta.getDescripcion() + "' where id = " + venta.getId());
        } catch (SQLException e) {
            throw new DAOException("Error al actualizar la venta en la base de datos", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }

    /**
     * Este mensaje permite obtener una venta que contenga el id que se le
     * pasa como parámetro, en caso de no existir ninguna devuelve un objeto
     * con todos sus atributos vacios
     * @param id
     * @return
     * @throws DAOException 
     */
    public VentaDTO getVenta(int id) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            ResultSet rs = stat.executeQuery("select * from venta where id = " + id + " LIMIT 1");
            VentaDTO venta = null;
            if (rs != null) {
                while (rs.next()) {
                    venta = new VentaDTO(rs.getInt("id"), rs.getDate("fecha"), rs.getInt("idCliente"), rs.getInt("idGarante1"), rs.getInt("idGarante2"), rs.getString("tipo"), rs.getDouble("precio"), rs.getDouble("entrega"), rs.getString("descripcion"));
                }
            }
            rs.close();
            return venta;
        } catch (SQLException e) {
            throw new DAOException("Error al leer la venta desde la base de datos", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }
    
    /**
     * Este método permite borrar una venta
     * @param id
     * @return true si fue exitoso y false si la venta no existe
     * @throws DAOException 
     */
    public boolean eliminarVenta(int id) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            if (stat.executeUpdate("delete from venta where id = '" + id + "'") == 0) {
                return false;
            } else {
                return true;
            }
        } catch (SQLException e) {
            throw new DAOException("Error al borrar la venta de la base de datos", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }
    
    /**
     * Este mensaje permite obtener una lista de ventas que contengan en sus 
     * atributos al cliente o la fecha que se le pasan como parámetro
     * @param agenda
     * @return lista de agendas
     * @throws DAOException 
     */
    public ArrayList<VentaReducidaDTO> buscarVentas(String cliente) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            ResultSet rs = stat.executeQuery("select venta.id, venta.fecha, persona.nombre as cliente, IF(moto.id, CONCAT(CONCAT(moto.marca,' - '),moto.modelo), venta.descripcion) as descripcion, venta.tipo, venta.precio from venta INNER JOIN persona ON venta.idCliente = persona.id AND lower(persona.nombre) like lower('%" + cliente + "%') LEFT JOIN moto ON venta.id = moto.idVenta ORDER BY fecha" );
            ArrayList<VentaReducidaDTO> lista = new ArrayList();
            while (rs.next()) {
                VentaReducidaDTO venta = new VentaReducidaDTO(rs.getInt("id"), rs.getDate("fecha"), rs.getString("cliente"), rs.getString("descripcion"), rs.getString("tipo"), rs.getDouble("precio"));
                lista.add(venta);
            }
            rs.close();
            return lista;
        } catch (SQLException e) {
            throw new DAOException("Error al leer las ventas desde la base de datos", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }

    public ArrayList<VentaReducidaDTO> listarVentas2() throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            ResultSet rs = stat.executeQuery("select venta.id, venta.fecha, persona.nombre as cliente, IF(moto.id, CONCAT(CONCAT(moto.marca,' - '),moto.modelo), venta.descripcion) as descripcion, venta.tipo, venta.precio from venta INNER JOIN persona ON venta.idCliente = persona.id LEFT JOIN moto ON venta.id = moto.idVenta ORDER BY fecha");
            ArrayList<VentaReducidaDTO> lista = new ArrayList();
            while (rs.next()) {
                VentaReducidaDTO venta = new VentaReducidaDTO(rs.getInt("id"), rs.getDate("fecha"), rs.getString("cliente"), rs.getString("descripcion"), rs.getString("tipo"), rs.getDouble("precio"));
                lista.add(venta);
            }
            rs.close();
            return lista;
        } catch (SQLException e) {
            throw new DAOException("Error al leer las ventas desde la base de datos", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }
}
